package com.liziba.mq.topic.consumer.rabbit;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;

/**
 * @auther LiZiBa
 * @date 2021/2/1 0:24
 * @description: 手动确认消息
 **/
@Component
public class MyAckReceiver implements ChannelAwareMessageListener {

    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {
            // 绑定多个队列按以下方式处理
            if ("logger.error".equals(message.getMessageProperties().getConsumerQueue())){
                System.out.println("消费的消息来自的队列名为："+message.getMessageProperties().getConsumerQueue());
                System.out.println("执行logger.error中的消息的业务处理流程......");
                String msg = message.toString();
                System.out.println(msg);
                //第二个参数，手动确认可以被批处理，当该参数为 true 时，则可以一次性确认 delivery_tag 小于等于传入值的所有消息
                channel.basicAck(deliveryTag, true);
                //第二个参数，true会重新放回队列，所以需要自己根据业务逻辑判断什么时候使用拒绝
                // channel.basicReject(deliveryTag, true);
            }
            if ("logger.info".equals(message.getMessageProperties().getConsumerQueue())){
                System.out.println("消费的消息来自的队列名为："+message.getMessageProperties().getConsumerQueue());
                System.out.println("执行logger.info中的消息的业务处理流程......");
                String msg = message.toString();
                System.out.println(msg);
                // 第二个参数，手动确认可以被批处理，当该参数为 true 时，则可以一次性确认 delivery_tag 小于等于传入值的所有消息
                channel.basicAck(deliveryTag, true);
                // 第二个参数，true会重新放回队列，所以需要自己根据业务逻辑判断什么时候使用拒绝
                // channel.basicReject(deliveryTag, true);
            }
        }catch (Exception e){
            //第二个参数，true会重新放回队列，所以需要自己根据业务逻辑判断什么时候使用拒绝
            channel.basicReject(deliveryTag, false);
            e.printStackTrace();
        }
    }
}
